import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;


public class Mediador {

	private Conexion conexionUno;
	private DataBase bdUno;
	private DataBase bdDos;
	private String resultado;
	private String resultadoProcedimientos;
	private String resultadoTriggers;

	public Mediador(){
		resultado = "";
		resultadoProcedimientos = "";
	}

	public Mediador(String host, String user, String password){
		Conexion cx = new Conexion();
		try {
			cx.getConexion(host, user, password, "", "");
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}

	public void cargarBDuno(String host,String usuario,String pw, String nombreBD,String schema) throws Exception{
		Connection connectionSql;
		bdUno = new DataBase(schema);
		conexionUno = new Conexion();
		connectionSql = conexionUno.getConexion(host,usuario,pw,nombreBD,schema);
		DatabaseMetaData meta = connectionSql.getMetaData();
		String [] type = {"TABLE"};
		ResultSet tablas = meta.getTables(null, schema , null, type);
		while(tablas.next()){
			String nombreTabla = tablas.getString(3);
			ResultSet columnas = meta.getColumns(null, schema, nombreTabla, null);
			ResultSet pk = meta.getPrimaryKeys(null, schema, nombreTabla);
			ResultSet foreing = meta.getCrossReference(null, schema, nombreTabla, null, null, null);
			bdUno.addTable(nombreTabla,columnas,pk,foreing);
		}

		ResultSet procedimientos = meta.getProcedures(null, schema, null);
		while(procedimientos.next()){
			String nombreProcedimiento = procedimientos.getString(3);
			ResultSet parametros = meta.getProcedureColumns(null, schema, nombreProcedimiento, null);
			bdUno.addProcedure(nombreProcedimiento,parametros);	

		}

		Statement st = connectionSql.createStatement();
		ResultSet triggers = st.executeQuery("select * from information_schema.triggers where trigger_schema = '" + schema + "';");
		while(triggers.next())
			bdUno.addTrigger(triggers.getString(3), triggers.getString(4), triggers.getString(12), triggers.getString(7));

		resultado = resultado + bdUno.toString();
	}

	public void cargarBDdos(String host,String usuario,String pw, String nombreBD,String schema) throws Exception{
		Connection connectionSql;
		bdDos = new DataBase(schema);
		conexionUno = new Conexion();
		connectionSql = conexionUno.getConexion(host,usuario,pw,nombreBD,schema);
		DatabaseMetaData meta = connectionSql.getMetaData();
		String [] type = {"TABLE"};
		
		ResultSet tablas = meta.getTables(null, schema , null, type);
		while(tablas.next()){
			String nombreTabla = tablas.getString(3);
			ResultSet columnas = meta.getColumns(null, schema, nombreTabla, null);
			ResultSet pk = meta.getPrimaryKeys(null, schema, nombreTabla);
			ResultSet foreing = meta.getCrossReference(null, schema, null, null, null, nombreTabla);
			bdDos.addTable(nombreTabla,columnas,pk,foreing);
		}
		
		ResultSet procedimientos = meta.getProcedures(null, schema, null);
		while(procedimientos.next()){
			String nombreProcedimiento = procedimientos.getString(3);
			ResultSet parametros = meta.getProcedureColumns(null, schema, nombreProcedimiento, null);
			bdDos.addProcedure(nombreProcedimiento,parametros);	
		}

		Statement st = connectionSql.createStatement();
		ResultSet triggers = st.executeQuery("select * from information_schema.triggers where trigger_schema = '" + schema + "';");
		while(triggers.next())
			bdDos.addTrigger(triggers.getString(3), triggers.getString(4), triggers.getString(12), triggers.getString(7));

		resultado = resultado + bdDos.toString();
	}

	public void comparador(){
		try{
			Comparador c = new Comparador();
			String nombreArchivo = "resultado.txt";
			File archivo = new File(nombreArchivo);
			if(!archivo.exists()){
				if(archivo.createNewFile())
					System.out.println("Archivo creado con exito");
				else
					System.out.println("El archivo no pudo ser creado");
			}
			System.out.println("Archivo  OK ! ");
			FileWriter fw = null;	 // la extension al archivo 
			fw = new FileWriter(nombreArchivo); 
			BufferedWriter bw = new BufferedWriter(fw); 
			PrintWriter salArch = new PrintWriter(bw);
			resultado = resultado + c.compararBasesDeDatos(bdUno, bdDos);
			resultadoProcedimientos = c.compararProcedimientos(bdUno, bdDos);
			resultadoTriggers = c.diferenciaTriggers(bdUno, bdDos);
			salArch.print(resultado);
			salArch.print("\n");
			salArch.print(resultadoProcedimientos);
			salArch.print("\n");
			salArch.print(resultadoTriggers);
			salArch.close(); 
			System.out.println("FIN");
		}
		catch(Exception e){
			e.printStackTrace();
		}
	}
}
